package com.maochang.top.dynamic_agent.proxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        //1.classLoader：加载动态生成的代理类的类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2.interfaces：目标对象实现的所有接口的class对象所组成的数组
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //3.invocationHandler：设置代理对象实现目标对象方法的过程，即代理类中如何重写接口中的抽象方法
        InvocationHandler invocationHandler=new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //1.method 接口的抽象方法
                //2.所有方法都必定会执行的一个invoke然后在执行被代理对象的具体方法
                //3.具体被代理类对象方法的执行
                Object rs=method.invoke(target,args);
                //4.被代理对象方法执行返回的结果--代理对象方法的执行最终会拿到这个结果
                return rs;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
